package com.sparkseries.common.log.utils;

import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;

import java.util.Objects;

/**
 * URL 工具类，主要用于根据 Spring 环境配置信息生成服务器的基础 URL。
 */
@Component
public class ServerAddressUtils {

    // 常量定义，提高代码可读性和可维护性
    private static final String HTTP_SCHEME = "http";
    private static final String HTTPS_SCHEME = "https";
    private static final String DEFAULT_SERVER_ADDRESS = "localhost";
    private static final String DEFAULT_SERVER_PORT = "8080";
    private static final String DEFAULT_HTTP_PORT = "80";
    private static final String DEFAULT_HTTPS_PORT = "443";
    private static final String SERVER_SSL_ENABLED_PROPERTY = "server.ssl.enabled";
    private static final String SERVER_ADDRESS_PROPERTY = "server.address";
    private static final String SERVER_PORT_PROPERTY = "server.port";

    /**
     * 根据传入的 Spring 环境配置获取服务器的基础 URL。
     * 基础 URL 包含协议（http 或 https）、服务器地址和端口号。
     *
     * @param environment Spring 环境配置对象
     * @return 服务器的基础 URL
     */
    public static String getServerBaseUrl(Environment environment) {
        // 检查 environment 是否为 null，避免空指针异常
        Objects.requireNonNull(environment, "Environment cannot be null");

        // 获取协议
        String scheme = getScheme(environment);
        // 获取服务器地址
        String serverAddress = getServerAddress(environment);
        // 获取服务器端口
        String serverPort = getServerPort(environment);

        StringBuilder baseUrl = new StringBuilder();
        baseUrl.append(scheme).append("://").append(serverAddress);

        // 判断是否需要添加端口号
        if (shouldAppendPort(scheme, serverPort)) {
            baseUrl.append(":").append(serverPort);
        }

        return baseUrl.toString();
    }

    /**
     * 根据环境配置获取协议（http 或 https）。
     *
     * @param environment Spring 环境配置对象
     * @return 协议字符串
     */
    private static String getScheme(Environment environment) {
        boolean isSslEnabled = Boolean.parseBoolean(environment.getProperty(SERVER_SSL_ENABLED_PROPERTY, "false"));
        return isSslEnabled ? HTTPS_SCHEME : HTTP_SCHEME;
    }

    /**
     * 根据环境配置获取服务器地址。
     *
     * @param environment Spring 环境配置对象
     * @return 服务器地址字符串
     */
    private static String getServerAddress(Environment environment) {
        return environment.getProperty(SERVER_ADDRESS_PROPERTY, DEFAULT_SERVER_ADDRESS);
    }

    /**
     * 根据环境配置获取服务器端口。
     *
     * @param environment Spring 环境配置对象
     * @return 服务器端口字符串
     */
    private static String getServerPort(Environment environment) {
        return environment.getProperty(SERVER_PORT_PROPERTY, DEFAULT_SERVER_PORT);
    }

    /**
     * 判断是否需要在基础 URL 中添加端口号。
     *
     * @param scheme     协议
     * @param serverPort 服务器端口
     * @return 如果需要添加端口号返回 true，否则返回 false
     */
    private static boolean shouldAppendPort(String scheme, String serverPort) {
        return (HTTP_SCHEME.equals(scheme) && !DEFAULT_HTTP_PORT.equals(serverPort))
                || (HTTPS_SCHEME.equals(scheme) && !DEFAULT_HTTPS_PORT.equals(serverPort));
    }
}